package com.longrou.base.base

import android.app.Activity
import android.app.Application
import android.content.Context
import android.os.Bundle
import android.support.multidex.MultiDex
import com.alibaba.android.arouter.launcher.ARouter
import com.longrou.base.BuildConfig
import com.longrou.base.R
import com.scwang.smartrefresh.layout.SmartRefreshLayout
import com.scwang.smartrefresh.layout.header.ClassicsHeader
import com.zhouyou.http.EasyHttp
import com.zhouyou.http.cache.converter.SerializableDiskConverter
import com.zhouyou.http.cache.model.CacheMode
import com.zhouyou.http.model.HttpHeaders
import java.util.*


/**
 * Created by J on 2017/9/21.
 */

class BaseAppKT : Application() {
    private var activityArrayList: ArrayList<Activity>? = null

    companion object {
        private var instance: BaseAppKT? = null

        init {
            SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
                layout.setPrimaryColorsId(R.color.colorPrimary,R.color.white)
                ClassicsHeader(context) }

            //设置全局的Footer构建器
            /*SmartRefreshLayout.setDefaultRefreshFooterCreater(new DefaultRefreshFooterCreater() {
            @Override
            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                //指定为经典Footer，默认是 BallPulseFooter
                return new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate);
            }
        });*/
        }
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
        BaseCrashHandler.getInstance().init(this)
        initActivityList()
        intiEasyHttp()
        if (BuildConfig.ISDEBUG) {
            // 这两行必须写在init之前，否则这些配置在init过程中将无效
            EasyHttp.getInstance()
                    .setBaseUrl("")
                    .debug("EasyHttp", true)
            ARouter.openLog()     // 打印日志
            ARouter.openDebug()   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(this)

    }

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

    private fun intiEasyHttp() {
        //默认初始化,必须调用
        EasyHttp.init(this)

        //全局设置请求头
        val headers = HttpHeaders()
        //headers.put("User-Agent", SystemInfoUtils.getUserAgent(this, AppConstant.APPID));
        //全局设置请求参数
        //HttpParams params = new HttpParams();
        //params.put("appId", AppConstant.APPID);

        //以下设置的所有参数是全局参数,同样的参数可以在请求的时候再设置一遍,那么对于该请求来讲,请求中的参数会覆盖全局参数
        EasyHttp.getInstance()

                //可以全局统一设置全局URL
                //设置全局URL  url只能是域名 或者域名+端口号
                .setBaseUrl("")
                // 打开该调试开关并设置TAG,不需要就不要加入该行
                // 最后的true表示是否打印内部异常，一般打开方便调试错误
                .debug("EasyHttp", true)

                //如果使用默认的60秒,以下三行也不需要设置
                .setReadTimeOut((60 * 1000).toLong())
                .setWriteTimeOut((60 * 100).toLong())
                .setConnectTimeout((60 * 100).toLong())

                //可以全局统一设置超时重连次数,默认为3次,那么最差的情况会请求4次(一次原始请求,三次重连请求),
                //不需要可以设置为0
                //网络不好自动重试3次
                .setRetryCount(3)
                //可以全局统一设置超时重试间隔时间,默认为500ms,不需要可以设置为0
                //每次延时500ms重试
                .setRetryDelay(500)
                //可以全局统一设置超时重试间隔叠加时间,默认为0ms不叠加
                //每次延时叠加500ms
                .setRetryIncreaseDelay(500)

                //可以全局统一设置缓存模式,默认是不使用缓存,可以不传,具体请看CacheMode
                .setCacheMode(CacheMode.NO_CACHE)
                //可以全局统一设置缓存时间,默认永不过期
                //-1表示永久缓存,单位:秒 ，Okhttp和自定义RxCache缓存都起作用
                .setCacheTime(-1)
                //全局设置自定义缓存保存转换器，主要针对自定义RxCache缓存
                //默认缓存使用序列化转化
                .setCacheDiskConverter(SerializableDiskConverter())
                //全局设置自定义缓存大小，默认50M
                //设置缓存大小为100M
                .setCacheMaxSize((100 * 1024 * 1024).toLong())
                //设置缓存版本，如果缓存有变化，修改版本后，缓存就不会被加载。特别是用于版本重大升级时缓存不能使用的情况
                //缓存版本为1
                .setCacheVersion(1)
                //.setHttpCache(new Cache())//设置Okhttp缓存，在缓存模式为DEFAULT才起作用

                //可以设置https的证书,以下几种方案根据需要自己设置
                .setCertificates()                                  //方法一：信任所有证书,不安全有风险
                //.setCertificates(new SafeTrustManager())            //方法二：自定义信任规则，校验服务端证书
                //配置https的域名匹配规则，不需要就不要加入，使用不当会导致https握手失败
                //.setHostnameVerifier(new SafeHostnameVerifier())
                //.addConverterFactory(GsonConverterFactory.create(gson))//本框架没有采用Retrofit的Gson转化，所以不用配置
                //设置全局公共头
                .addCommonHeaders(headers)
                //设置全局公共参数
                //.addCommonParams(params)
                //.addNetworkInterceptor(new NoCacheInterceptor())//设置网络拦截器
                //.setCallFactory()//局设置Retrofit对象Factory
                //.setCookieStore()//设置cookie
                //.setOkproxy()//设置全局代理
                //.setOkconnectionPool()//设置请求连接池
                //.setCallbackExecutor()//全局设置Retrofit callbackExecutor
                //可以添加全局拦截器，不需要就不要加入，错误写法直接导致任何回调不执行
                //.addInterceptor(new GzipRequestInterceptor())//开启post数据进行gzip后发送给服务器
                //添加参数签名拦截器
                //.addInterceptor(CustomSignInterceptor())

    }

    private fun initActivityList() {
        activityArrayList = ArrayList()
        registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, bundle: Bundle) {
                activityArrayList!!.add(activity)
            }

            override fun onActivityStarted(activity: Activity) {

            }

            override fun onActivityResumed(activity: Activity) {

            }

            override fun onActivityPaused(activity: Activity) {

            }

            override fun onActivityStopped(activity: Activity) {

            }

            override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {

            }

            override fun onActivityDestroyed(activity: Activity) {
                activityArrayList!!.remove(activity)
            }
        })
    }

    fun exitApp() {
        val iterator = activityArrayList!!.iterator()
        while (iterator.hasNext()) {
            val activity = iterator.next()
            activity.finish()
            iterator.remove()
        }
        activityArrayList!!.clear()
        System.exit(0)
    }


}
